{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 对树的最大深度和min_children_weight进行调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T11:14:35.781384Z",
     "start_time": "2018-10-26T11:14:31.377132Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "import graphviz\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T11:14:39.956622Z",
     "start_time": "2018-10-26T11:14:37.127461Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T11:14:40.047628Z",
     "start_time": "2018-10-26T11:14:39.963623Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train = train.drop('interest_level', axis = 1)\n",
    "y_train = train['interest_level']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  参数调试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T11:14:41.032684Z",
     "start_time": "2018-10-26T11:14:41.018683Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第1个程序初步确定了n_estimators为220，下面max_depth及min_children_weight以这个为基础。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T11:14:44.291870Z",
     "start_time": "2018-10-26T11:14:44.263869Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T14:47:43.031772Z",
     "start_time": "2018-10-26T11:14:55.223496Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.60221, std: 0.00318, params: {'max_depth': 3, 'min_child_weight': 1},\n",
       "  mean: -0.60259, std: 0.00328, params: {'max_depth': 3, 'min_child_weight': 3},\n",
       "  mean: -0.60249, std: 0.00324, params: {'max_depth': 3, 'min_child_weight': 5},\n",
       "  mean: -0.58874, std: 0.00413, params: {'max_depth': 5, 'min_child_weight': 1},\n",
       "  mean: -0.58963, std: 0.00368, params: {'max_depth': 5, 'min_child_weight': 3},\n",
       "  mean: -0.58945, std: 0.00342, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.58914, std: 0.00317, params: {'max_depth': 7, 'min_child_weight': 1},\n",
       "  mean: -0.58937, std: 0.00370, params: {'max_depth': 7, 'min_child_weight': 3},\n",
       "  mean: -0.58880, std: 0.00357, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -0.60226, std: 0.00388, params: {'max_depth': 9, 'min_child_weight': 1},\n",
       "  mean: -0.59922, std: 0.00566, params: {'max_depth': 9, 'min_child_weight': 3},\n",
       "  mean: -0.59578, std: 0.00374, params: {'max_depth': 9, 'min_child_weight': 5}],\n",
       " {'max_depth': 5, 'min_child_weight': 1},\n",
       " -0.5887351903261084)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=220,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2 = GridSearchCV(xgb2, param_grid = param_test2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2.fit(X_train , y_train)\n",
    "\n",
    "gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T14:49:31.140956Z",
     "start_time": "2018-10-26T14:49:31.100954Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 516.72515492,  520.96919775,  503.97622581,  678.46380582,\n",
       "         681.46597753,  690.25608044,  881.54002118,  868.64648376,\n",
       "         864.98947458, 1043.77170033, 1033.81033063,  989.83981562]),\n",
       " 'mean_score_time': array([1.05506039, 1.08386197, 1.03165889, 1.72709894, 1.73929949,\n",
       "        1.75810056, 3.19038253, 3.07497592, 2.9857708 , 5.88253651,\n",
       "        5.2250989 , 4.22264161]),\n",
       " 'mean_test_score': array([-0.60221355, -0.60258789, -0.60248802, -0.58873519, -0.5896312 ,\n",
       "        -0.58944899, -0.58913874, -0.58937052, -0.58879567, -0.60226239,\n",
       "        -0.5992217 , -0.59577645]),\n",
       " 'mean_train_score': array([-0.57934346, -0.58039194, -0.58062066, -0.51307099, -0.51860785,\n",
       "        -0.5216289 , -0.41140123, -0.43188637, -0.44436297, -0.28925616,\n",
       "        -0.33405741, -0.36088415]),\n",
       " 'param_max_depth': masked_array(data=[3, 3, 3, 5, 5, 5, 7, 7, 7, 9, 9, 9],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 3, 'min_child_weight': 1},\n",
       "  {'max_depth': 3, 'min_child_weight': 3},\n",
       "  {'max_depth': 3, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 1},\n",
       "  {'max_depth': 5, 'min_child_weight': 3},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 1},\n",
       "  {'max_depth': 7, 'min_child_weight': 3},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 9, 'min_child_weight': 1},\n",
       "  {'max_depth': 9, 'min_child_weight': 3},\n",
       "  {'max_depth': 9, 'min_child_weight': 5}],\n",
       " 'rank_test_score': array([ 9, 12, 11,  1,  6,  5,  3,  4,  2, 10,  8,  7]),\n",
       " 'split0_test_score': array([-0.59718233, -0.59755885, -0.59754902, -0.58158764, -0.58314373,\n",
       "        -0.58353967, -0.58360141, -0.58340028, -0.58298684, -0.59603885,\n",
       "        -0.59162462, -0.59073589]),\n",
       " 'split0_train_score': array([-0.58064649, -0.58189678, -0.58198419, -0.51426812, -0.52108818,\n",
       "        -0.52421332, -0.41408905, -0.43407694, -0.44724648, -0.29044847,\n",
       "        -0.33451259, -0.36093259]),\n",
       " 'split1_test_score': array([-0.60104532, -0.60064765, -0.60097704, -0.58707311, -0.58810703,\n",
       "        -0.58866632, -0.5880868 , -0.58896407, -0.58731069, -0.6009535 ,\n",
       "        -0.59504577, -0.59438868]),\n",
       " 'split1_train_score': array([-0.57953769, -0.58013393, -0.58092299, -0.51331312, -0.51929918,\n",
       "        -0.5215851 , -0.41159355, -0.43228231, -0.44331824, -0.2873028 ,\n",
       "        -0.33325499, -0.35994555]),\n",
       " 'split2_test_score': array([-0.60224379, -0.60292823, -0.60207521, -0.58981377, -0.5914366 ,\n",
       "        -0.58941579, -0.59092677, -0.59159907, -0.58965595, -0.60514167,\n",
       "        -0.60092744, -0.59624683]),\n",
       " 'split2_train_score': array([-0.57998605, -0.58073122, -0.58024079, -0.51313176, -0.51814476,\n",
       "        -0.52096814, -0.41043844, -0.430493  , -0.44315709, -0.28905527,\n",
       "        -0.33376329, -0.35984012]),\n",
       " 'split3_test_score': array([-0.60687784, -0.60702766, -0.6069041 , -0.59225852, -0.59205739,\n",
       "        -0.59248019, -0.59017319, -0.58834349, -0.59024109, -0.60177296,\n",
       "        -0.60029458, -0.59525694]),\n",
       " 'split3_train_score': array([-0.57893447, -0.58019172, -0.58062218, -0.51365396, -0.51834379,\n",
       "        -0.52163631, -0.41021898, -0.43072178, -0.442881  , -0.28749213,\n",
       "        -0.33219344, -0.36065894]),\n",
       " 'split4_test_score': array([-0.6037189 , -0.6047777 , -0.60493547, -0.59294419, -0.59341242,\n",
       "        -0.5931441 , -0.59290666, -0.59454728, -0.59378529, -0.60740654,\n",
       "        -0.6082188 , -0.60225588]),\n",
       " 'split4_train_score': array([-0.57761259, -0.57900605, -0.57933314, -0.51098801, -0.51616331,\n",
       "        -0.51974163, -0.41066613, -0.43185784, -0.44521202, -0.29198212,\n",
       "        -0.33656276, -0.36304357]),\n",
       " 'std_fit_time': array([26.39365968, 13.93109522,  7.66012141, 22.99797649, 19.32993284,\n",
       "        26.97559857, 35.91156373, 30.57645326, 25.75673415, 14.99791498,\n",
       "        23.06406304, 54.4417261 ]),\n",
       " 'std_score_time': array([0.05560187, 0.05981437, 0.01763724, 0.04593742, 0.09888818,\n",
       "        0.10759601, 0.12676587, 0.2568239 , 0.28528846, 0.52309829,\n",
       "        0.47860918, 0.63213938]),\n",
       " 'std_test_score': array([0.00318443, 0.00327659, 0.00323544, 0.00412657, 0.00368385,\n",
       "        0.00341687, 0.0031696 , 0.00370473, 0.00356846, 0.00388418,\n",
       "        0.00565946, 0.00373628]),\n",
       " 'std_train_score': array([0.0010307 , 0.00093883, 0.00086633, 0.00111122, 0.00160561,\n",
       "        0.00146148, 0.00142312, 0.00128483, 0.00165996, 0.00177878,\n",
       "        0.0014621 , 0.00115647])}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-26T14:55:33.220666Z",
     "start_time": "2018-10-26T14:55:32.409619Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.588735 using {'max_depth': 5, 'min_child_weight': 1}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\starwin\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x128a2b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"Best: %f using %s\" % (gsearch2.best_score_, gsearch2.best_params_))\n",
    "test_means = gsearch2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最优max_depth是: 5, 最优min_child_weight是: 1。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  },
  "notify_time": "5",
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
